package persistencia;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import outros.Conexao;
import transporte.TOFornecedor;

public class DAOFornecedor {
    private Conexao conexao = new Conexao();
    private Connection con = null;

    public boolean abrirConexao() {
        UIManager.put("OptionPane.yesButtonText", "Sim");
        UIManager.put("OptionPane.noButtonText", "Não");
        UIManager.put("OptionPane.cancelButtonText", "Cancelar");
        try {
            conexao.abrirConexao();
            con = conexao.getConexao();
            return true;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao tentar conectar ao banco de dados.");
            return false;
        }
    }

    public String criar(TOFornecedor fornecedor) {
        PreparedStatement ps = null;
        String sql = "INSERT INTO patri_fornecedor VALUES (?,?,?,?,?,?,?,?,?)";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            int id = getProximo();
            if (id!=0) {
                ps.setInt(1, id);
                ps.setString(2, fornecedor.getNome());
                ps.setString(3, fornecedor.getEndereco());
                ps.setString(4, fornecedor.getSetor());
                ps.setString(5, fornecedor.getCidade());
                ps.setString(6, fornecedor.getEstado());
                ps.setString(7, fornecedor.getCep());
                ps.setString(8, fornecedor.getTelefone());
                ps.setString(9, fornecedor.getContato());
                ps.execute();
                con.commit();
                conexao.fecharConexao();
                return "";
            } else {
                conexao.fecharConexao();
                JOptionPane.showMessageDialog(null, "Erro ao tentar atribuir novo ID.");
                return "erro";
            }
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar inserir dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public TOFornecedor selecionarRegistro(int id) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        sql = "SELECT * FROM patri_fornecedor WHERE numero="+id;
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            TOFornecedor to;
            if (rs.first()) {
                to = new TOFornecedor();
                to.setNumero(rs.getInt("numero"));
                to.setNome(rs.getString("nome").trim());
                to.setEndereco(rs.getString("endereco").trim());
                to.setSetor(rs.getString("setor").trim());
                to.setCidade(rs.getString("cidade").trim());
                to.setEstado(rs.getString("estado").trim());
                to.setCep(rs.getString("cep").trim());
                to.setTelefone(rs.getString("telefone").replaceAll(" ", ""));
                to.setContato(rs.getString("contato").trim());
                return to;
            }
            conexao.fecharConexao();
            return null;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar dados. Detalhes: "+e.toString());
            return null;
        }
    }

    public ArrayList<TOFornecedor> selecionar(String busca) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        if (busca.length()==0) {
            sql = "SELECT * FROM patri_fornecedor ORDER BY nome ASC";
        } else {
            sql = "SELECT * FROM patri_fornecedor WHERE sem_acento(nome) ILIKE '%"+busca+"%' ORDER BY nome ASC";
        }
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            ArrayList<TOFornecedor> al = new ArrayList();
            TOFornecedor to = null;
            while (rs.next()) {
                to = new TOFornecedor();
                to.setNumero(rs.getInt("numero"));
                to.setNome(rs.getString("nome").trim());
                to.setEndereco(rs.getString("endereco").trim());
                to.setSetor(rs.getString("setor").trim());
                to.setCidade(rs.getString("cidade").trim());
                to.setEstado(rs.getString("estado").trim());
                to.setCep(rs.getString("cep").trim());
                to.setTelefone(rs.getString("telefone").replaceAll(" ", ""));
                to.setContato(rs.getString("contato").trim());
                al.add(to);
            }
            return al;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar dados. Detalhes: "+e.toString());
            return null;
        }
    }

    public String excluir(int numero) {
        PreparedStatement ps = null;
        String sql = "DELETE FROM patri_fornecedor WHERE numero=?";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            ps.setInt(1, numero);
            ps.execute();
            conexao.fecharConexao();
            return "";
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar excluír dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public String alterar(TOFornecedor fornecedor) {
        PreparedStatement ps = null;
        String sql = "UPDATE patri_fornecedor SET nome=?, endereco=?, setor=?, cidade=?," +
                     "estado=?, cep=?, telefone=?, contato=? WHERE numero=?";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            ps.setString(1, fornecedor.getNome());
            ps.setString(2, fornecedor.getEndereco());
            ps.setString(3, fornecedor.getSetor());
            ps.setString(4, fornecedor.getCidade());
            ps.setString(5, fornecedor.getEstado());
            ps.setString(6, fornecedor.getCep());
            ps.setString(7, fornecedor.getTelefone());
            ps.setString(8, fornecedor.getContato());
            ps.setInt(9, fornecedor.getNumero());
            ps.execute();
            con.commit();
            conexao.fecharConexao();
            return "";
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar alterar dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    private int getProximo(){
        String sql = "SELECT MAX(numero) FROM patri_fornecedor";
        try {
            Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet rs = st.executeQuery(sql);
            if (rs.first()){
                return rs.getInt(1)+1;
            } else {
                return 0;
            }
        } catch (Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            return 0;
        }
    }
}
